{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 调用xgboost内嵌的cv找到最佳的参数n_estimators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = pd.read_csv(\"RentListingInquries_FE_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "y_train=train['interest_level']\n",
    "X_train=train.drop(['interest_level'],axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/model_selection/_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "#训练样本6w+，交叉验证太慢，用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part,X_val,y_train_part,y_val=train_test_split(X_train,y_train,train_size=0.33,random_state=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#直接调用xgboost内嵌的交叉验证（cv），可对连续的n_estimators参数进行快速交叉验证\n",
    "#而GridSearchCV只能对有限个参数进行交叉验证\n",
    "def modelfit(alg,X_train,y_train,cv_folds=5,early_stopping_rounds=10):\n",
    "    xgb_param=alg.get_xgb_params()\n",
    "    xgb_param['num_class']=3\n",
    "    xgtrain=xgb.DMatrix(X_train,label=y_train)\n",
    "    cvresult=xgb.cv(xgb_param,xgtrain,num_boost_round=alg.get_params()['n_estimators'], \\\n",
    "                    folds=cv_folds,metrics='mlogloss',early_stopping_rounds=early_stopping_rounds)\n",
    "    cvresult.to_csv('1_nestimators.csv',index_label='n_estimators')\n",
    "    #最佳参数n_estimators\n",
    "    n_estimators=cvresult.shape[0]\n",
    "    #采用交叉验证得到的最佳参数n_estimators,训练模型\n",
    "    alg.set_params(n_estimators=n_estimators)\n",
    "    alg.fit(X_train,y_train,eval_metric='mlogloss')\n",
    "    #predict training set\n",
    "    train_predprob=alg.predict_proba(X_train)\n",
    "    logloss=log_loss(y_train,train_predprob)\n",
    "    print(\"logloss of train: %s\"%(logloss))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of train: 0.483498378452\n"
     ]
    }
   ],
   "source": [
    "xgb1=XGBClassifier(learning_rate=0.1, \\\n",
    "                   n_estimators=1000, \\\n",
    "                   # CV会自动返回合适的n_estimators\n",
    "                   max_depth=6, min_child_weight=1,gamma=0, \\\n",
    "                   subsample=0.5,colsample_bytree=0.8,colsample_bylevel=0.7, \\\n",
    "                   objective='multi:softprob',seed=3)\n",
    "\n",
    "modelfit(xgb1,X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/ipykernel_launcher.py:2: FutureWarning: from_csv is deprecated. Please use read_csv(...) instead. Note that some of the default arguments are different, so please refer to the documentation for from_csv when changing your function calls\n",
      "  \n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x117d60eb8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#可视化\n",
    "cvresult=pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "\n",
    "test_means=cvresult['test-mlogloss-mean']\n",
    "test_stds=cvresult['test-mlogloss-std']\n",
    "train_means=cvresult['train-mlogloss-mean']\n",
    "train_stds=cvresult['test-mlogloss-std']\n",
    "\n",
    "x_axis=range(0,cvresult.shape[0])\n",
    "\n",
    "pyplot.errorbar(x_axis,test_means,yerr=test_stds,label='Test')\n",
    "pyplot.errorbar(x_axis,train_means,yerr=train_stds,label='Train')\n",
    "pyplot.title('XGBoost n_estimators vs Log Loss')\n",
    "pyplot.xlabel('n_estimators')\n",
    "pyplot.ylabel('Log Loss')\n",
    "pyplot.savefig('n_estimators4_1.png')\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "log loss值最小，也就是n_estimators最佳的地方是接近200，准确值为198。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
